// Package api internal/api/admin_api.go
package api

import (
	"github.com/gin-gonic/gin"
	"gorm.io/gorm"
	"gozrd-admin-api/internal/entity/dto"
	"gozrd-admin-api/internal/repository"
	"gozrd-admin-api/internal/service"
	"gozrd-admin-api/pkg/response"
	"strconv"
)

// AdminAPI 管理员控制器
type AdminAPI struct {
	adminService service.IAdminService
}

// NewAdminAPI 创建管理员控制器
func NewAdminAPI(db *gorm.DB) *AdminAPI {
	adminRepo := repository.NewAdminRepository(db)
	adminService := service.NewAdminService(adminRepo)

	return &AdminAPI{
		adminService: adminService,
	}
}

// CreateSysAdmin 创建系统管理员
// @Summary 创建系统管理员
// @Description 新增一个系统管理员
// @Tags 管理员
// @Accept json
// @Produce json
// @Param data body dto.AddSysAdminDto true "管理员信息"
// @Success 200 {object} response.Response "ok"
// @Failure 400 {object} response.Response "请求错误"
// @Failure 500 {object} response.Response "内部错误"
// @Router /admin [post]
func (a *AdminAPI) CreateSysAdmin(c *gin.Context) {
	var adminDTO dto.AddSysAdminDto

	// 绑定请求参数，假设有全局中间件处理基本绑定错误
	_ = c.ShouldBindJSON(&adminDTO)

	// 直接调用服务层方法
	a.adminService.CreateSysAdmin(c, adminDTO)
}

// GetSysAdmin 根据id查询用管理员信息
// @Summary 根据id查询用户接口
// @Description 获取系统管理员信息
// @Tags 管理员
// @Accept json
// @Produce json
// @Param id query int true "id"
// @Success 200 {object} response.Response{data=vo.SysAdminInfoVo} "获取成功"
// @Router /admin/info [get]
func (a *AdminAPI) GetSysAdmin(c *gin.Context) {
	Id, err := strconv.Atoi(c.Query("id"))
	if err != nil {
		response.Fail(c, response.ErrParams, "无效的ID参数")
		return
	}
	a.adminService.GetSysAdmin(c, Id)
}

// UpdateSysAdmin 修改用户
// @Summary 修改用户接口
// @Tags 管理员
// @Accept json
// @Produce json
// @Description 修改用户接口
// @Param data body dto.UpdateSysAdminDto true "data"
// @Success 200 {object} response.Response
// @router /admin [put]
// @Security ApiKeyAuth
func (a *AdminAPI) UpdateSysAdmin(c *gin.Context) {
	var DTO dto.UpdateSysAdminDto
	if err := c.BindJSON(&DTO); err != nil {
		response.Fail(c, response.ErrParams, err.Error())
		return
	}

	a.adminService.UpdateSysAdmin(c, DTO)
}

// DeleteSysAdmin 根据id删除用户
// @Summary 根据id删除接口
// @Produce json
// @Tags 管理员
// @Description 根据id删除接口
// @Param data body dto.SysAdminIdDto true "data"
// @Success 200 {object} response.Response
// @router /admin [delete]
func (a *AdminAPI) DeleteSysAdmin(c *gin.Context) {
	var idDTO dto.SysAdminIdDto

	if err := c.ShouldBindJSON(&idDTO); err != nil {
		response.Fail(c, response.ErrParams, err.Error())
		return
	}
	a.adminService.DeleteSysAdmin(c, idDTO.Id)
}

// GetSysAdminList 分页获取用户列表
// @Summary 分页获取用户列表接口
// @Tags 管理员
// @Produce json
// @Description 分页获取用户列表接口
// @Param pageNum query int false "分页数"
// @Param pageSize query int false "每页数"
// @Param username query string false "用户名"
// @Param status query string false "帐号启用状态：1->启用,2->禁用"
// @Param beginTime query string false "开始时间"
// @Param endTime query string false "结束时间"
// @Success 200 {object} response.Response{data=vo.SysAdminListVo} "获取成功"
// @router /admin/list [get]
// @Security ApiKeyAuth
// GetSysAdminList 分页获取用户列表
func (a *AdminAPI) GetSysAdminList(c *gin.Context) {
	// 获取并转换查询参数
	pageNumStr := c.Query("pageNum")
	pageSizeStr := c.Query("pageSize")
	username := c.Query("username")
	status := c.Query("status")
	beginTime := c.Query("beginTime")
	endTime := c.Query("endTime")

	// 转换分页参数，设置默认值
	pageNum, err := strconv.Atoi(pageNumStr)
	if err != nil || pageNum <= 0 {
		pageNum = 1
	}

	pageSize, err := strconv.Atoi(pageSizeStr)
	if err != nil || pageSize <= 0 || pageSize > 100 {
		pageSize = 10
	}

	// 调用服务层
	a.adminService.GetSysAdminList(c, pageSize, pageNum, username, status, beginTime, endTime)
}

// ResetSysAdminPassword 重置管理员密码 管理员可以修改他人密码
// @Summary 重置密码接口(管理员可以修改他人密码)
// @Accept json
// @Produce json
// @Tags 管理员
// @Description 重置密码接口
// @Param data body dto.ResetSysAdminPasswordDto  true "data"
// @Success 200 {object} response.Response
// @router /admin/updatePassword [put]
func (a *AdminAPI) ResetSysAdminPassword(c *gin.Context) {
	var resetDTO dto.ResetSysAdminPasswordDto

	if err := c.ShouldBindJSON(&resetDTO); err != nil {
		response.Fail(c, response.ErrParams, err.Error())
		return
	}

	a.adminService.ResetSysAdminPassword(c, resetDTO)
}

// UpdateSysAdminStatus 更新管理员状态
// @Summary 用户状态启用/停用接口
// @Produce json
// @Description 用户状态启用/停用接口
// @Tags 管理员
// @Param data body dto.UpdateSysAdminStatusDto true "data"
// @Success 200 {object} response.Response
// @router /admin/updateStatus [put]
func (a *AdminAPI) UpdateSysAdminStatus(c *gin.Context) {
	var statusDTO dto.UpdateSysAdminStatusDto

	if err := c.ShouldBindJSON(&statusDTO); err != nil {
		response.Fail(c, response.ErrParams, err.Error())
		return
	}

	a.adminService.UpdateSysAdminStatus(c, statusDTO)
}

// UpdatePersonal 修改个人信息
// @Summary 修改个人信息接口
// @Produce json
// @Tags 管理员
// @Description 修改个人信息接口
// @Param data body dto.UpdatePersonalDto true "data"
// @Success 200 {object} response.Response
// @router /admin/updatePersonal [put]
// @Security ApiKeyAuth
func (a *AdminAPI) UpdatePersonal(c *gin.Context) {
	var personalDTO dto.UpdatePersonalDto

	if err := c.ShouldBindJSON(&personalDTO); err != nil {
		response.Fail(c, response.ErrParams, err.Error())
		return
	}

	// 如需服务层添加此方法，请取消下面注释
	a.adminService.UpdatePersonal(c, personalDTO)
}

// UpdatePersonalPassword 更新个人密码
// @Summary 更新个人密码
// @Produce json
// @Tags 管理员
// @Description 更新个人密码
// @Param data body dto.UpdatePersonalPasswordDto true "data"
// @Success 200 {object} response.Response
// @router /admin/updatePersonalPassword [put]
// @Security ApiKeyAuth
func (a *AdminAPI) UpdatePersonalPassword(c *gin.Context) {
	var passwordDTO dto.UpdatePersonalPasswordDto

	if err := c.ShouldBindJSON(&passwordDTO); err != nil {
		response.Fail(c, response.ErrParams, err.Error())
		return
	}

	a.adminService.UpdatePersonalPassword(c, passwordDTO)
}
